import axios from 'axios'
import { getToken, removeToken, removeUser } from './auth'
import router from '@/router'

// 默认配置
const axiosInstance = axios.create({
  baseURL: 'http://localhost:3000/', // 设置统一的 API 根路径
  timeout: 10000, // 设置请求超时
})

// 请求重试最大次数
const MAX_RETRIES = 3

//请求拦截器 携带token
axiosInstance.interceptors.request.use(
  (config) => {
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = token // 将 token 加入请求头
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

// 响应拦截器：简化响应数据并统一处理 401 错误
axiosInstance.interceptors.response.use(
  (response) => {
    return response.data // 直接返回响应的 data
  },
  async (error) => {
    const { response, config } = error
    const originalRequest = config // 获取原始请求对象

    // 401 错误：未授权，处理 Token 失效的情况
    if (response && response.status === 401) {
      removeToken() // 清除 token
      removeUser() // 清除用户信息
      router.push('/login') // 跳转到登录页面
    }

    // 网络请求重试机制：最大重试次数
    if (originalRequest && !originalRequest._retry) {
      originalRequest._retry = true
      originalRequest.__retryCount = originalRequest.__retryCount || 0

      // 判断是否重试次数已达上限
      if (originalRequest.__retryCount < MAX_RETRIES) {
        originalRequest.__retryCount += 1
        return new Promise((resolve) => {
          setTimeout(() => {
            resolve(axiosInstance(originalRequest)) // 重试请求
          }, 1000) // 设置每次重试的间隔时间
        })
      }
    }

    // 如果不是 401 错误或重试机制无效，直接抛出错误
    return Promise.reject(error)
  },
)

export default axiosInstance
